#!/bin/bash
# **********************************************************
# * Author : liangliangSu
# * Email : sll917@hotmail.com
# * Create time : 2023-02-04 17:39
# * Filename : 01文件处理工具.sh
# **********************************************************
#1.1 grep工具：行过滤
: '
grep用于根据关键字进行行过滤
grep options 'keys' filename
OPTIONS:
    -i: 不区分大小写
    -v: 查找不包含指定内容的行,反向选择
    -w: 按单词搜索
    -o: 打印匹配关键字
    -c: 统计匹配到的次数
    -n: 显示行号
    -r: 逐层遍历目录查找
    -A: 显示匹配行及后面多少行    
    -B: 显示匹配行及前面多少行
    -C: 显示匹配行前后多少行
    -l：只列出匹配的文件名
    -L：列出不匹配的文件名
    -e: 使用正则匹配
    -E:使用扩展正则匹配
    ^key:以关键字开头
    key$:以关键字结尾
    ^$:匹配空行
    --color=auto ：可以将找到的关键词部分加上颜色的显示

临时设置：
# alias grep='grep --color=auto'            //只针对当前终端和当前用户生效

永久设置：
1）全局（针对所有用户生效）
vim /etc/bashrc
alias grep='grep --color=auto'
source /etc/bashrc

2）局部（针对具体的某个用户）
vim ~/.bashrc
alias grep='grep --color=auto'
source ~/.bashrc
'
echo '(1)-----------------------完美分割线--------------------------------'
#示例：
 grep -i root /etc/passwd        # 忽略大小写匹配包含root的行
 grep -w ftp /etc/passwd         # 精确匹配ftp单词
 grep -w hello /etc/passwd       # 精确匹配hello单词;自己添加包含hello的行到文件中
 grep -wo ftp /etc/passwd        # 打印匹配到的关键字ftp
 grep -n root /etc/passwd        # 打印匹配到root关键字的行好
 grep -ni root /etc/passwd       # 忽略大小写匹配统计包含关键字root的行
 grep -nic root /etc/passwd      # 忽略大小写匹配统计包含关键字root的行数
 grep -i ^root /etc/passwd       # 忽略大小写匹配以root开头的行
 grep bash$ /etc/passwd          # 匹配以bash结尾的行
 grep -n ^$ /etc/passwd          # 匹配空行并打印行号
echo '(2)-----------------------完美分割线--------------------------------'
 grep ^# /var/lib/dpkg/info/openssh-server.list # 匹配以#号开头的行
echo '(3)-----------------------完美分割线--------------------------------'
 grep -v ^# /var/lib/dpkg/info/openssh-server.list # 匹配不以#号开头的行
echo '(4)-----------------------完美分割线--------------------------------'
 grep -A 5 mail /etc/passwd      #匹配包含mail关键字及其后5行
 grep -B 5 mail /etc/passwd      #匹配包含mail关键字及其前5行
 grep -C 5 mail /etc/passwd      #匹配包含mail关键字及其前后5行

#.2 cut工具：截取
: '
cut用于列截取
-c:    以字符为单位进行分割。
-d:    自定义分隔符，默认为制表符。\t
-f:    与-d一起使用，指定显示哪个区域。
'
echo '(5)-----------------------完美分割线--------------------------------'
 cut -d: -f1 cut.txt            # 以:冒号分割，截取第1列内容
 cut -d: -f1,6,7 cut.txt        # 以:冒号分割，截取第1,6,7列内容
 cut -c4 cut.txt                # 截取文件中每行第4个字符
 cut -c1-4 cut.txt              # 截取文件中每行的1-4个字符
 cut -c4-10 cut.txt             # 截取文件中每行的4-10个字符
 cut -c5- cut.txt               # 从第5个字符开始截取后面所有字符

#课堂练习：
#用小工具列出你当系统的运行级别。5/3
echo '(5)-----------------------完美分割线--------------------------------'
runlevel | cut -c3   
: ' 
Linux系统有7个运行级别（runlevel）:
运行级别0：系统停机状态，系统默认运行级别不能设为0，否则无法正常启动
运行级别1：单用户模式，可用于修改root账户密码，禁止远程登录
运行级别2：多用户模式（没有NFS）
运行级别3：完全的多用户状态（有NFS）,登录后进去控制台命令行模式
运行级别4：系统未使用，保留
运行级别5：X11控制台，登录后进去图形GUI模式
运行级别6：系统正常关闭并重启，默认运行级别不能设置为6，否则无法正常启动
'
#1.3 sort工具：排序

: '
sort：将文件的每一行作为一个单位，从首字符向后，依次按ASCII码值进行比较，最后将他们按升序输出。

-u ：去除重复行
-r ：降序排列，默认是升序
-o : 将排序结果输出到文件中  类似 重定向符号>
-n ：以数字排序，默认是按字符排序
-t ：分隔符
-k ：第N列
-b ：忽略前导空格。
-R ：随机排序，每次运行的结果均不同。
'
echo '(6)-----------------------完美分割线--------------------------------'
# 示例：
 sort -n -t: -k3 sort.txt              #按照用户的uid进行升序排列
 sort -nr -t: -k3 sort.txt             #按照用户的uid进行降序排列
 sort -n sort2.txt                     #按照数字排序
 sort -nu sort2.txt                    #按照数字排序并且去重
 sort -nr sort2.txt                    #按照数字降序排序
 sort -nru sort2.txt                   #按照数字降序排序并且去重
 sort -n sort2.txt -o sort3.txt        #按照数字排序并将结果重定向到文件
 sort -R sort2.txt                     #按照随机排序
 sort -u sort2.txt                     #去重排序

#1.4 uniq工具 ：去除连续的重复行
: '
uniq：去除连续重复行
-i: 忽略大小写
-c: 统计重复行次数
-d:只显示重复行
'
echo '(7)-----------------------完美分割线--------------------------------'
uniq uniq.txt 
echo '(8)-----------------------完美分割线--------------------------------'
uniq -d uniq.txt 
echo '(9)-----------------------完美分割线--------------------------------'
uniq -dc uniq.txt 

#1.5 tee工具
# tee工具从标准输入读取并写入标准输出和文件，
# 即：双向覆盖重定向<屏幕输出|文本输入>
# -a 双向追加重定向

echo '(10)-----------------------完美分割线--------------------------------'
echo hello world
echo '(11)-----------------------完美分割线--------------------------------'
echo hello world|tee tee.txt
echo '(13)-----------------------完美分割线--------------------------------'
cat tee.txt 
echo '(14)-----------------------完美分割线--------------------------------'
echo 999|tee -a tee.txt
echo '(15)-----------------------完美分割线--------------------------------'
cat tee.txt

#1.6 paste工具：paste工具用于合并文件行
: '
-d：自定义间隔符，默认是tab
-s：串行处理，非并行
'
echo '(16)-----------------------完美分割线--------------------------------'
cat paste1.txt 
cat paste2.txt 
echo '(17)-----------------------完美分割线--------------------------------'
paste paste1.txt paste2.txt 
echo '(18)-----------------------完美分割线--------------------------------'
paste paste2.txt paste1.txt   
echo '(19)-----------------------完美分割线--------------------------------'
paste -d'@' paste2.txt paste1.txt 
echo '(20)-----------------------完美分割线--------------------------------'
paste -s paste2.txt paste1.txt 
echo '(21)-----------------------完美分割线--------------------------------'
paste -s paste1.txt paste2.txt 

#1.7 tr工具：字符转换：替换，删除
: <<!
tr用来从标准输入中通过替换或删除操作进行字符转换；主要用于删除文件中控制字符或进行字符转换。
使用tr时要转换两个字符串：字符串1用于查询，字符串2用于处理各种转换。

语法：tr [选项]... 'String1' 'String2'
tr  'string1'  'string2' < filename
tr options 'string1' < filename

-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列，只保留第一个；即将重复出现字符串压缩为一个字符串。
string 是一组字符串，一般都可按照字面含义理解。解析序列如下：
  \NNN	八进制值为NNN 的字符(1 至3 个数位)
  \\		反斜杠
  \a		终端鸣响
  \b		退格
  \f		换页
  \n		换行
  \r		回车
  \t		水平制表符
  \v		垂直制表符
  字符1-字符2	从字符1 到字符2 的升序递增过程中经历的所有字符
  [字符*]	在SET2 中适用，指定字符会被连续复制直到吻合设置1 的长度
  [字符*次数]	对字符执行指定次数的复制，若次数以 0 开头则被视为八进制数
  [:alnum:]	所有的字母和数字
  [:alpha:]	所有的字母
  [:blank:]	所有呈水平排列的空白字符
  [:cntrl:]	所有的控制字符
  [:digit:]	所有的数字
  [:graph:]	所有的可打印字符，不包括空格
  [:lower:]	所有的小写字母
  [:print:]	所有的可打印字符，包括空格
  [:punct:]	所有的标点字符
  [:space:]	所有呈水平或垂直排列的空白字符
  [:upper:]	所有的大写字母
  [:xdigit:]	所有的十六进制数
  [=CHAR=]     所有和指定字符相等的字符
!
#cat 3.txt    # 自己创建该文件用于测试
#ROOT:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
#boss02:x:516:511::/home/boss02:/bin/bash
#vip:x:517:517::/home/vip:/bin/bash
#stu1:x:518:518::/home/stu1:/bin/bash
#mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
#smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
#aaaaaaaaaaaaaaaaaaaa
#bbbbbb111111122222222222233333333cccccccc
#hello world 888
#666
#777
#999

echo '(22)-----------------------完美分割线--------------------------------'
tr -d '[:/]' < tr.txt             # 删除文件中的:和/
echo '(23)-----------------------完美分割线--------------------------------'
cat tr.txt |tr -d '[:/]'          # 删除文件中的:和/
echo '(24)-----------------------完美分割线--------------------------------'
tr '[0-9]' '@' < tr.txt           # 将文件中的数字替换为@符号
echo '(25)-----------------------完美分割线--------------------------------'
tr '[a-z]' '[A-Z]' < tr.txt       # 将文件中的小写字母替换成大写字母
echo '(26)-----------------------完美分割线--------------------------------'
tr -s '[a-z]' < tr.txt            # 匹配小写字母并将重复的压缩为一个
echo '(27)-----------------------完美分割线--------------------------------'
tr -s '[a-z0-9]' < tr.txt         # 匹配小写字母和数字并将重复的压缩为一个
echo '(28)-----------------------完美分割线--------------------------------'
tr -d '[:digit:]' < tr.txt        # 删除文件中的数字
echo '(29)-----------------------完美分割线--------------------------------'
tr -d '[:blank:]' < tr.txt        # 删除水平空白
echo '(30)-----------------------完美分割线--------------------------------'
tr -d '[:space:]' < tr.txt        # 删除所有水平和垂直空白
echo -e '\n(31)-----------------------完美分割线--------------------------------'

#小试牛刀
#1,使用小工具分别截取当前主机IP；截取NETMASK；截取广播地址；截取MAC地址

echo '(32)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep 'dcast'|tr -d '[a-zA-Z ]'|cut -d: -f2,3,4
echo '(34)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep 'dcast'|tr -d '[a-zA-Z ]'|cut -d: -f2,3,4|tr ':' '\n'
echo '(35)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep 'ether'|cut -d: -f2-|cut -d' ' -f4
echo '(36)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep dcast|cut -d: -f2|cut -d' ' -f1
echo '(37)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep dcast|cut -d: -f2|tr -d '[ a-zA-Z]'
echo '(38)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep 'dcast'|tr -d [:alpha:]|tr '[ :]' '\n'|grep -v ^$
echo '(39)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep ether|cut -d ' ' -f11
echo '(40)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep ether|tr -s ' '|cut -d' ' -f5
echo '(41)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep ether|tr -s ' '|cut -d' ' -f5
echo '(42)-----------------------完美分割线--------------------------------'
ifconfig enp0s3|grep dcast|tr -d '[:a-zA-Z]'|tr ' ' '@'|tr -s '@'|tr '@' '\n'|grep -v ^$

#2,将系统中所有普通用户的用户名、密码和默认shell保存到一个文件中，要求用户名密码和默认shell之间用tab键分割
echo '(43)-----------------------完美分割线--------------------------------'
grep 'bash$' /etc/passwd |grep -v '^root'|cut -d: -f1,2,7|tr ':' '\t'
echo '(44)-----------------------完美分割线--------------------------------'
grep bash$ /etc/passwd |grep -viE 'root|mysql'|cut -d: -f1,2,7|tr ':' '\t' |tee tr2.txt
#注释：
#-E 匹配扩展正则表达式，|代表或者，是一个扩展正则
